// 描述
// 有一个 hh 行 ww 列的网格，我们使用 (i,j)(i,j) 表示网格中从上往下数第 ii 行和从左往右数第 jj 列的单元格。每个方格要么是可以通过的空方格 ‘0’‘0’ ，要么是不可通过的墙方格 ‘1’‘1’ ，特别的，网格的四周都是墙方格，你可以沿着空方格上下左右随意移动：从 (x,y)(x,y) 向上移动一格即抵达 (x−1,y)(x−1,y) 、向下移动一格即抵达 (x+1,y)(x+1,y) 、向左移动一格即抵达 (x,y−1)(x,y−1) 、向右移动一格即抵达 (x,y+1)(x,y+1) 。
// 现在，你位于迷宫的入口 (0,0)(0,0) ，想要前往终点 (h−1,w−1)(h−1,w−1) 。请输出一条从起点到终点的可行路径。
// 保证起点和终点一定为空方格，你始终可以找到且能唯一找到一条从起点出发到达终点的可行路径。
// 输入描述：
// 第一行输入两个整数 h,w(1≦h,w≦100)h,w(1≦h,w≦100) 代表迷宫的行数和列数。
// 此后 hh 行，第 ii 行输入 ww 个整数 ai,1,ai,2,…,ai,w(0≦ai,j≦1)ai,1​,ai,2​,…,ai,w​(0≦ai,j​≦1) 代表迷宫的布局。其中，ai,j=0ai,j​=0 表示单元格 (i,j)(i,j) 是空方格，ai,j=1ai,j​=1 表示单元格 (i,j)(i,j) 是墙方格。

// 输出描述：
// 输出若干行，第 ii 行输出两个整数 xi,yixi​,yi​ ，表示路径的第 ii 步抵达的单元格坐标为 (xi,yi)(xi​,yi​) 。
// 你需要保证输出的路径是符合题目要求的，即从起点 (0,0)(0,0) 出发，到达终点 (h−1,w−1)(h−1,w−1) ，且路径上每个单元格都是空方格，行走的单元格都是彼此相邻的。

// 示例1
// 输入：5 5
// 0 1 0 0 0
// 0 1 1 1 0
// 0 0 0 0 0
// 0 1 1 1 0
// 0 0 0 1 0

// 输出：(0,0)
// (1,0)
// (2,0)
// (2,1)
// (2,2)
// (2,3)
// (2,4)
// (3,4)
// (4,4)

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    line = await readline();
    let [h, w] = line.split(" ").map(Number),
        graph = new Array(h).fill(0).map(() => new Array(w).fill(0)),
        visit = new Array(h).fill(0).map(() => new Array(w).fill(false)),
        index = 0;

    while ((line = await readline())) {
        graph[index] = line.split(" ").map(Number).slice();
        index++;
    }


    let a = dfs(graph, visit, 0, 0, [[0,0]]);

    for(let [x,y] of a){
        console.log(`(${x},${y})`)
    }

})();

function dfs(graph, visit, x, y, valArr) {
    if(x === graph.length - 1 && y === graph[0].length - 1){
        return true
    }
    visit[x][y] = true
    let direction = [
        [1, 0],
        [-1, 0],
        [0, -1],
        [0, 1],
    ];
    for (let [left, right] of direction) {
        let newx = x + left,
            newy = y + right;
        if (
            newx < 0 ||
            newx >= graph.length ||
            newy < 0 ||
            newy >= graph[0].length 
        ){
            continue;
        }
        if(visit[newx][newy] === false && graph[newx][newy] === 0){
            valArr.push([newx,newy])
            if(dfs(graph, visit, newx, newy, valArr)) return valArr
            valArr.pop()
        }
    }
}
